/*
 * 文 件 名:  createXMLFile.java
 * 版    权:   深圳埃思欧纳信息咨询有限公司版权所有. YYYY-YYYY,  All rights reserved
 * 描    述:   <描述>
 * 修 改 人:  honny.huang
 * 修改时间: 2011-4-7
 * 跟踪单号:  <跟踪单号>
 * 修改单号:  <修改单号>
 * 修改内容:  <修改内容>
 */
package com.dom4j.createAndparseXml;

import java.io.File;
import java.io.FileWriter;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;

/**
 * <一句话功能简述> <功能详细描述>
 *
 * @author honny.huang
 * @version [版本号, 2011-4-7]
 * @see [相关类/方法]
 * @since [产品/模块版本]
 */

public class CreateXMLFile 
{
	 /** 
     * 建立一个XML文档,文档名由输入属性决定 
     * @param filename 需建立的文件名 
     * @return 返回操作结果, 0表失败, 1表成功 
     */
	public int createXMLFile(String filename)
	{
		/** 返回操作结果, 0表失败, 1表成功 */ 
	    int returnValue = 0; 
	    /** 创建doucment,定义一个XML文档对象*/
	    Document document = DocumentHelper.createDocument();
	    /** 建立XML文档的根books */ 
	    Element booksElement = document.addElement("books");
	    /** 加入一行注释 */ 
        booksElement.addComment("This is a test for dom4j, holen, 2004.9.11");
        
        /** 加入第一个book节点 */ 
        Element bookElement1 = booksElement.addElement("book");
        /** 加入show属性内容 */
        bookElement1.addAttribute("show", "yes");
        /** 加入title节点 */ 
        Element titleElement1 = bookElement1.addElement("title");
        /** 为title设置内容 */ 
        titleElement1.setText("Dom4j Tutorials");
        
        /** 加入第二个book节点 */ 
        Element bookElement2 = booksElement.addElement("book");
        /** 加入show属性内容 */
        bookElement2.addAttribute("show", "yes");
        /** 加入title节点 */ 
        Element titleElement2 = bookElement2.addElement("title");
        /** 为title设置内容 */ 
        titleElement2.setText("Lucene Studing");
        
        /** 加入第三个book节点 */ 
        Element bookElement3 = booksElement.addElement("book");
        /** 加入show属性内容 */
        bookElement3.addAttribute("show", "no");
        /** 加入title节点 */ 
        Element titleElement3 = bookElement3.addElement("title");
        /** 为title设置内容 */ 
        titleElement3.setText("Lucene in Action");
        
        /** 加入第四个节点*/
        Element ownerElement = booksElement.addElement("owner");
        /** 加入owner节点 */ 
        ownerElement.setText("O'Reilly");
        try 
        {
            /** 将document中的内容写入文件中 */ 
        	//  FileWriter out = new FileWriter( foo.xml ); 
        	//  document.write(out);  文件输出
            XMLWriter writer =  new XMLWriter(new FileWriter(new File(filename)));
            /**通过XMLWriter生成物理文件*/
            writer.write(document);
            writer.close();
            /** 执行成功,需返回1 */ 
            returnValue = 1;
		} catch (Exception e) 
		{
			e.printStackTrace();
		}
		return returnValue;
	}
	
	 /** 
     * 修改XML文件中内容,并另存为一个新文件 
     * 重点掌握dom4j中如何添加节点,修改节点,删除节点 
     * @param filename 修改对象文件 
     * @param newfilename 修改后另存为该文件 
     * @return 返回操作结果, 0表失败, 1表成功 
     */ 
	// 有三项修改任务，依次为： 
//	        如果book节点中show属性的内容为yes,则修改成no 
//     把owner项内容改为Tshinghua，并添加date节点 
//	        若title内容为Dom4j Tutorials,则删除该节点
	public int ModiXMLFile(String filename,String newfilename)
	{ 
		int returnValue = 0;
		try 
		{
			SAXReader saxReader = new SAXReader();
			Document document = saxReader.read(new File(filename));
			/** 修改内容之一: 如果book节点中show属性的内容为yes,则修改成no */ 
	        /** 先用xpath查找对象 */ 
			List showAttributeList = document.selectNodes("/books/book/@show");
			Iterator interator = showAttributeList.iterator();
			while (interator.hasNext())
			{
				Attribute attribute = (Attribute) interator.next();
				String showValue = attribute.getValue();
				if ("yes".equals(showValue))
				{
					attribute.setValue("no");
				}
			}
			/** 
            * 修改内容之二: 把owner项内容改为Tshinghua 
            * 并在owner节点中加入date节点,date节点的内容为2004-09-11,还为date节点添加一个属性type 
            */ 
			List ownerList = document.selectNodes("/books/owner");
			for (Iterator ownerIter = ownerList.iterator(); ownerIter.hasNext();)
			{
				Element ownerElement = (Element) ownerIter.next();
				ownerElement.setText("Tshinghua");
				Element dateElement = ownerElement.addElement("date");
				dateElement.setText("2004-09-11");
				dateElement.addAttribute("type", "Gregorian calendar");
			}
			/** 修改内容之三: 若title内容为Dom4j Tutorials,则删除该节点 */ 
			// 注意：删除节点的时候一定要是父元素执行remove方法，而不是document对象
			List bookList = document.selectNodes("/books/book");
			Iterator bookIter = bookList.iterator();
			while (bookIter.hasNext())
			{
				Element bookElement = (Element) bookIter.next();
				Iterator titleIter = bookElement.elementIterator("title");
				while (titleIter.hasNext()) 
				{
					Element titleElement = (Element) titleIter.next();
					String titleValue = titleElement.getText();
					if ("Dom4j Tutorials".equals(titleValue)) 
					{
						bookElement.remove(titleElement);
					}
				}
			}
			try {
				 /** 将document中的内容写入文件中 */ 
                 XMLWriter writer = new XMLWriter(new FileWriter(new File(newfilename)));
                 writer.write(document);
                 writer.close();
                 returnValue = 1;
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
		catch (Exception e) 
		{
			e.printStackTrace();
		}
		return returnValue;
	}
	
	/** 
     * 格式化XML文档,并解决中文问题 
     * @param filename 
     * @return 
     */ 
    public int formatXMLFile(String filename)
    {
    	int returnValue = 0;
    	try 
    	{
    		SAXReader saxReader = new SAXReader();
    		Document document = saxReader.read(new File(filename));
    		XMLWriter writer = null;
    		/** 格式化输出,类型IE浏览一样 */ 
    		// 美化格式 
            OutputFormat format = OutputFormat.createPrettyPrint(); 
            // 缩减格式 
            // format = OutputFormat.createCompactFormat(); 
            /** 指定XML编码 */ 
            format.setEncoding("GBK");
            writer = new XMLWriter(new FileWriter(new File(filename)),format);
            writer.write(document);
            writer.close();
            /** 执行成功,需返回1 */ 
            returnValue = 1;
		} catch (Exception e) 
		{
			e.printStackTrace();
		}
        return returnValue ; 
    } 

//    // XML转字符串 
//    Document document = ...; 
//        String text = document.asXML(); 
//    // 字符串转XML 
//        String text = <person> <name>James</name> </person>; 
//        Document document = DocumentHelper.parseText(text); 
      
    
    // 调试
    public static void main(String[] args) 
    {
    	CreateXMLFile createXMLFile = new CreateXMLFile();
		String filename = "E:\\Workspaces\\knowledgePoints\\src\\com\\dom4j\\createAndparseXml\\holen.xml";
		String newfilename = "E:\\Workspaces\\knowledgePoints\\src\\com\\dom4j\\createAndparseXml\\holen2.xml";
//		int createValue = createXMLFile.createXMLFile(filename);
//		int modifyValue = createXMLFile.ModiXMLFile(filename, newfilename);
		int formatValue = createXMLFile.formatXMLFile(newfilename);
		
	}

}
